<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // https://juejin.cn/post/6844903507917537293
        var promisify = (func, ctx) => {
            // 返回一个新的function
            return function () {
                // 初始化this作用域
                console.log('ctx 1',ctx);
                var ctx = ctx || this;
                console.log('ctx 2',ctx);

                // 新方法返回的promise
                return new Promise((resolve, reject) => {
                    // 调用原来的非promise方法func，绑定作用域，传参，以及callback（callback为func的最后一个参数）
                    func.call(ctx, ...arguments, function () {
                        // 将回调函数中的的第一个参数error单独取出
                        console.log('arguments',arguments);
                        var args = Array.prototype.map.call(arguments, item => item);
                        console.log('args 1',args);

                        var err = args.shift();
                        console.log('args 2',args);
                        console.log('error',err);
                        // 判断是否有error
                        if (err) {
                            console.log('has err');
                            reject(err)
                        } else {
                            console.log('no err');
                            // 没有error则将后续参数resolve出来
                            args = args.length > 1 ? args : args[0];
                            resolve(args);
                        }
                    });
                })
            };
        };
        // nodeCallback方法func1
        var func1 = function (a, b, c, callback) {
            callback(null, a + b + c);
        }
        // promise化后的func2
        var func2 = promisify(func1);
        // 调用后输出6
        func1(1, 2, 3, (err, result) => {
            if (!err) {
                console.log(result); //输出6
            }
        })
        func2(1, 2, 3).then(console.log); //输出6

    </script>
</body>

</html>